시스템 프로그래밍의 기반 요소
System Call(시스템 콜)
C Library
C compiler
시스템 콜운영체제 리소스나 서비스 요청을 위해 사용자 영역에서 커널 영역으로 들어가는 함수
사용자 영역에서 커널 영역에 요청을 하는 방법!
리눅스는 커널 영역이 C언어로 개발되어 있기 때문에 System Call도 C언어로 구현되어 있다.
시스템 콜의 유사한 기능을 라이브러리 형태로 정리되어 있음(API)
시스템 콜은 어떻게 구현이 되는가?eax 레지스터에 시스템 콜 번호를 넣고
ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣는다.
소프트웨어 인터럽트 명령을 호출하면, 0x80값을 넘겨준다.
mov eax, 1
mov ebx, 0
int 0x80 // 소프트웨어 인터럽트 명령어
운영체제에서 다양한 인터럽트가 존재한다.
그중 0x80(128)은 System Call 인터럽트에 해당
Sysetm Call 인터럽트 중 1번은 sys_exit 시스템콜이다.
소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨준다.
1. CPU는 사용자 모드를 커널 모드로 바꿔준다.
2. IDT(Interrupt Desciptor Table)에서 0x80에 해당하는 주소(함수)를 찾아서 실행-PC 해당 주소로 변경
3. system_call()함수에서 eax로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템콜 함수로 이동
4. 해당 시스템콜 함수 실행 후, 다시 커널 모드에서 사용자 모드로 변경하고, 다시 해당 프로세스 다음 코드 진행
C 라이브러리유닉스 C 라이브러리 -libc
리눅스 C 라이브러리 -GNU libc-glibc(지립씨, 글립씨)->default 설치
시스템콜, 시스템콜 래퍼, 기본 응용 프로르갬 기능 포함
C 컴파일러유닉스 C 컴파일러- cc
리눅스 C 컴파일러- GNU cc -gcc(지씨씨)
우분투 리눅스에 gcc 설치
$sudo apt-get install gcc
$gcc —version
$gcc -o test.c test
$./ test
API응용프로그램과 분리된 하위 호환 인터페이스(응용프로그램이 변경되지 않아도 하위(라이브러리)가 변경되면 실행이 변경됨)
ex) 시스템콜 래퍼, 입출력 라이브러리 등(함수 내용이 구현되어 있지 않음-시스템콜 사용: 시스템콜 래핑)
시스템콜 래퍼를 통해 시스템콜을 사용하기 쉬운 함수 형태로 사용자에게 제공
정적 라이브러리 & 동적 라이브러리정적 라이브러리는 실행파일을 생성할 때, 라이브러리가 호출되면 이미 바이너리 형태로 되어 있는 라이브러리를 실행파일에 더해서 실행파일을 만든다.
동적 라이브러리는 실행파일에서 해당 라이브러리가 실행되지 않을 수도 있을 경우 사용된다.
만일 해당 라이브러리가 실행되면 그 때, 그 라이브러리를 참고하게 된다.
실행파일은 해당 라이브러리를 미리 포함하지 않은 상태로 만들어진다.(실행시 해당 라이브러리 참고)
.a : 리눅스 / 정적 라이브러리
.so : 리눅스 / 동적 라이브러리
.lib : 윈도우 / 정적 라이브러리
.dll : 윈도우 / 동적 라이브러리
컴파일한 object 파일은 그대로여도, 라이브러리가 다른 바이너리 파일로 업데이트 되어 바뀌면
다른 실행 결과가 발생함
라이브러리는 응용프로그램과 분리되어 있다.